home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / cal / cal.doc < prev    next >
Text File  |  1993-11-30  |  8KB  |  118 lines

  1. **************************************************************************
  2. *  数式計算プログラム CAL                                                *
  3. *                                                             1993.7.30  *
  4. **************************************************************************
  5.  
  6. @はじめに
  7.  
  8.  「パソコンは計算機なのに、どうして足し算くらいの簡単な計算もできないんだ!」とお嘆きの方は多いと思います。僕もそうでした。誤解の無いように言いますと、もちろん計算は出来ます。ただ、四則演算のみであったり、マウスでボタンを押していくような物であったり、いまいち、使い勝手が悪い(失礼!)。こう、電卓の様な軽快さが欲しい・・。かつての、BASICインタプリタを基本とするマシンであれば、? 式、とすれば計算してくれたもんですが。
  9.  そこで、コマンドラインから数式を書き込めば答えが返ってくる「数式計算プログラム CAL」を発表します。このプログラムを、システムにでも置いておけばとても重宝することうけあいです。パソコンが立ち上がってさえいれば、即座に、解が得られます。特に、DOSがメインでコマンドをブリバリ打ち込んで使っている(某国民機ではこんな使い方がいまだに主流であろうが)ような方にはお勧めです。
  10.  ただ、GCCを使ってコンパイルしたので、EXP形式となってしまい、若干軽さに欠ける結果となってしまいました。他のコンパイラをお持ちの方は、そちらでコンパイルし直すことをお勧めします。
  11.  
  12. @システム構成
  13.  
  14.  実行ファイルは、基本的には
  15.  
  16.    TOWNS(モデル不問)+DOS(要RUN386.EXE)
  17.  
  18. です。しかし、DOSに限らず、コンソールであればなんでもいいです。
  19.  ソースはCで書いてあります。変なライブラリは使ってませんので、Cのコンパイラがあればどの機種でも使えるはずです。実際、最初に作った時はPC-9801+MS-Cという組合せでした。ソ-スについて、を参照してください。
  20.  
  21. @使い方
  22.  
  23.  コマンドラインで
  24.  
  25. RUN386 A:CAL 数式↓
  26.  
  27. と入力します。ただし、RUN386.EXEはフルパス指定する必要があります。いまの例ではA:としましたが実際にはCALのあるディレクトリまで指定しなければなりません。フロッピーならいいけど、CD-ROMだと大変です。
  28.  数式を書かずにCALとだけ入力すると、数式も併せて入力するよう、例付きで優しく注意してくれます。
  29.  
  30. @使用できる二項演算子
  31.  
  32.  優先度の高い順に書いていきます。
  33.  
  34. ^    巾乗を行います。 例:2^8=256
  35.  
  36. *,/,%  積、商、余りを求めます。この三つは同じ優先度です。 例:10%4=2
  37.  
  38. +,-   和、差を求めます。この二つは同じ優先度です。
  39.  
  40.  優先度が同じならば、左から演算していきます。また、単項演算子としての+、-(平たく言えば正負の符号)は、最も優先度が高くなっています。これは、FB386とは仕様が異なりますのでご注意下さい。
  41.  
  42. @使用できる関数
  43.  
  44.  使用できる関数はほぼCの数学関数に準じたものと、オリジナルのものがあります。関数名の記述は全て半角小文字で行ってください。
  45.  
  46.  ○Cに準ずる関数
  47.  
  48.   abs(x)   アブソリュートです。xの絶対値を返します。xは実数扱いです。
  49.   acos(x)  アークコサインです。
  50.   asin(x)  アークサインです。
  51.   atan(x)  アークタンジェントです。
  52.   ceil(x)  シーリングです。xを下回らない最小の整数を返します。
  53.   cos(x)   コサインです。
  54.   cosh(x)  ハイパボリックコサインです。
  55.   exp(x)   指数関数です。eのx乗を返します。
  56.   floor(x)  フロアーです。xを上回らない最大の整数を返します。
  57.   log(x)   自然対数関数です。eを底とする対数を返します。
  58.   log10(x)  常用対数関数です。10を底とする対数を返します。
  59.   sin(x)   サインです。
  60.   sinh(x)  ハイパボリックサインです。
  61.   sqrt(x)  スクウェアルートです。xの平方根を返します。
  62.   tan(x)   タンジェントです。
  63.   tanh(x)  ハイパボリックタンジェントです。
  64.   pow(x,a)  xのa乗を返します。x^aと同じです。
  65.  
  66.  ○オリジナル関数
  67.  
  68.   sinc(x)     シンク関数、サンプリング関数と呼ばれるものです。
  69.   pulse(x)     単パルス関数です。-0.5≦x≦0.5のとき1を返します。
  70.   triangle(x)   三角波関数です。周期2π、振幅1となっています。サインが三角形になったと思ってください。
  71.   log2(x)     対数関数です。2を底とする対数を返します。
  72.   pai(a,b,X)
  73.   sigma(a,b,X)  総和、総積を求める関数です。paiが総積で、sigmaが総和です。使い方は同じなのでまとめて説明します。
  74.  これは、数学で言うところの
  75.  
  76.              b
  77.             Σ X
  78.               k=a
  79.  
  80. に当たります。すなわち、aは初期値、bは終値、Xはアーギュメントkを含んだ数式(含まなくてもよい)を表しています。しかし、本プログラムにおける記述ではkはどこにも宣言されません。というのは、アーギュメントとなる変数はプログラムが勝手に選んでしまいます。ユーザーは選択できません。その選び方は、アルファベットの順にa、b、c・・と付けていきます。通常はa一つだけでこと足りるのですが、入れ子になっている場合、つまり、Xの中にさらにsigma・pai関数があるような場合、b、cと使っていきます。ですから、使う時はこの事を頭に入れておいて、入れ子の深さに応じてアーギュメントを付けてください。まあ、よっぽどの事がないと入れ子になんかする必要はないと思います。
  81.  例を示すと、
  82.    sigma(1,100,a)
  83. とすれば、1+2+3+・・・+99+100という計算をし、ガウス先生よりも速く答えを出します。
  84.  注意事項ですが、アーギュメントの増分は1に固定されています。従って、偶数のみ、3の倍数のみという様な変則の場合は、数式Xで工夫してください。結構しんどいと思いますが、・・・・。
  85.  
  86. @使用できる定数
  87.  
  88.  円周率と自然対数の値は、それぞれpaiとeで自動的に代入されます。必ず半角小文字で記述してください。
  89.  このpaiとeにはかなり多くの桁数で代入します。だから、例えば
  90.  
  91.    cal pai
  92.  
  93. と入力すれば、普通の人が記憶しているよりも多くの桁数がわかります(円周率を何十桁も暗記しているような人は普通ではありません)。
  94.  
  95. @ソースについて
  96.  
  97.  前に書いたように、最初は研究室の98用にMS-Cで作りました。で、それを自宅のTOWNSに持ってきたのですが、GCCではitoa関数が用意されていないようで、コンパイルできませんでした。それで、TOWNS用には自作のitoa関数を付けました。従って、MS-C等他のコンパイラでコンパイルする時はitoa関数の本体とプロトタイプ宣言は削除してください。また、このitoa関数は本プログラムにおける使用にのみ耐えるように、大幅に機能を制限して作ってありますので、他のプログラムに組み込んで使用することは避けてください。
  98.  Cの知識のある方なら、定数、オリジナル関数の追加は比較的容易だと思います。個人使用なら改造しても結構です。
  99.  また、数式解析のメインルーチンはanalize関数により呼び出されます。ですから、あなたの自作プログラムに組み込むことも可能です。戻り値が解で、引き数は数式を格納した文字列へのポインタ、エラーの有無を返す整数型のポインタです。このプログラムを組み込んだプログラムを発表する時は、使用した旨を明記してください。
  100.  アルゴリズムの話をすると、通常、数式解析には逆ポーランド記法と言うのが使われます。しかし、こいつは同じ式を何度も使うような時は都合がよいが、実定数がほとんどで一回のみの計算には向かないようです。それで、このプログラムでは逐次二項演算法(僕が命名した)を用いています。これは、どんなに複雑な式でも全て二項演算の繰り返しである、という性質を利用しています。関数は一つの数と見ることができます。
  101.  最初、FB386で作りかけたのですが、構造化言語ではない、特にローカル変数が使えない、ということで断念しました。FB386は高機能だ、とは言ってもやはりその辺が苦しいところですね。
  102.  
  103. @その他の注意事項
  104.  
  105.  ○ 答えは実数形式と指数形式との二通りで示されます。値の絶対値が小さいうちは実数形式の方が見やすいのですが、大きくなってくると指数形式の方が見やすくなります。 ○ 入力した値は全て実数で扱われます。実数と整数の区別はしません。
  106.  ○ 巾乗の結果の精度が余り良くないようです。2^8は255.999999と表示されます。ま、そのへんは察してやってください。
  107.  ○ 不正な値となる場合(分母が0、対数の引き数が負、ルートの中が負などなど)は、極力プログラム内で検出してメッセージを出すようにしています。
  108.  ○ エラーメッセージは色々ありますが、全て(妙な)英語です。察してやってください。
  109.  ○ どなたか、このプログラムをFB386で利用可能なプロシジャ形式に変換してくれませんか。
  110.  ○ 著作権は保持します。使用は個人使用に限ります。知人に個別にコピーするのは個人使用に含めましょう。その場合は、必ずこの説明ファイルを添付してください。
  111.  ○ ご意見、ご希望、文句、バグ情報等受け付けます、って連絡先はどこやねん!!。フリコレ事務局に連絡すれば、こっちに回ってくるのでしょうか・・・。
  112. (↑フレコリじゃないよ c.f. Oh!FMTOWMS '93 8)
  113.  
  114. @さいごに
  115.  
  116.  本プログラムを作成するに当たって、たくさんのアドバイスをいただきましたGERO氏に感謝します。
  117.  
  118.